$(function ready() {
    //初始化表格
    initTable();
    // 获取币种列表和汇率
    let $data = $('[data-name="currency"]').each(function () {
        getCurrency($(this))
    });
    getCurrency($('#payCurrency'));
    getCurrency($('#baseCurrency'));
    // 监听两个币种下拉框的变化
    $('#payCurrency').change(function () {
        getExchangeRate();
    });
    $('#baseCurrency').change(function () {
        getExchangeRate();
    });
    // 商品总数量和总金额
    sumColumns($('#productCostTable'));
    // 优惠总额输入框内容跟踪
    $('#discountPayPrice').change(function () {
        let exchangeRate = parseFloat($("#exchangeRate").val());
        let discountPayPrice = parseFloat($('#discountPayPrice').val());
        $('#discountBasePrice').text(toFloat(exchangeRate * discountPayPrice));
        updateAllCostPrice();
    });
    // 运费输入框内容跟踪
    $('#shippingPayPrice').change(function () {
        let exchangeRate = parseFloat($("#exchangeRate").val());
        let shippingPayPrice = parseFloat($('#shippingPayPrice').val());
        $('#shippingBasePrice').text(toFloat(exchangeRate * shippingPayPrice));
        updateAllCostPrice();
    });
});


/**
 * 获取币种列表
 */
function getCurrency($currency) {
    $.get({
        url: '/currency/getCurrency',
        success: function (result) {
            //先清空内容
            $currency.empty();
            if (result.data.length == 0) {
                // 查询结果无数据，填充一个数据
                $currency.append($('<option>', {
                    value: "-1",
                    text: "无"
                }));
            }
            // 遍历响应数据，创建并添加新的 <option> 元素
            $.each(result.data, function (index, item) {
                let $newOption = $('<option>', {
                    value: item.currencyCode,
                    text: item.currencyName
                });
                // 将新的 <option> 元素添加到 <select> 中
                $currency.append($newOption);
            });
            // 获取汇率
            getExchangeRate();
        },
        error: function (xhr, status, error) {
            console.error("Failed to fetch shops:", xhr.responseText);
        }
    });
}

/**
 * 获取总汇率并更新表格
 */
function getExchangeRate() {
    // 更新下拉框时，更新所有的付款币种
    $('[name="payCurrency"]').text($('#payCurrency').find('option:selected').text());
    // 更新下拉框时，更新所有的基础币种
    $('[name="baseCurrency"]').text($('#baseCurrency').find('option:selected').text());
    // 币种编码有一个为空，无需更新汇率
    let payCurrencyCode = $('#payCurrency').val();
    let baseCurrencyCode = $('#baseCurrency').val();
    if (!payCurrencyCode || !baseCurrencyCode) {
        return;
    }
    $.get({
        url: '/currency/getExchangeRate',
        data: {
            payCurrencyCode: payCurrencyCode,
            baseCurrencyCode: baseCurrencyCode
        },
        success: function (result) {
            $('#exchangeRate').val(result.data.exchangeRate);
            // 更新汇率后，更新表格内所有的基础货币有关的元素
            $("#productCostTable tr").not(":first").each(function (index, element) {
                updateBasePriceByTable($(element));
            });
            // 更新统计数据的基础获取相关元素
            updateBasePrice();
        }
    });
}

/**
 * 新增一行 点击事件
 */
$("#addOneTr").click(function () {
    addOneTr($("#productCostTable"));
});

/**
 * 模态框展示时，如果列表中只有表头，则新增一行
 */
function initTable() {
    if ($("#productCostTable").find("tbody tr").length > 0) {
        return;
    }
    // 在这里执行数据初始化代码
    addOneTr($("#productCostTable"));
    addOneTr($("#productCostTable"));
    addOneTr($("#productCostTable"));
}

/**
 * 更新 所有行的 成本单价（付） 和成本总价（付）
 * @param $tr
 */
function updateAllCostPrice() {
    $('#productCostTBody').find('tr').each(function () {
        updateCostPrice($(this));
    })
    // 计算订单总成本
    sumPrice();
}

/**
 * 更新 当前行的 成本单价（基） 和成本总价（基）
 * @param $tr
 */
function updateCostPrice($tr) {
    // 汇率
    let exchangeRate = parseFloat($("#exchangeRate").val());
    // 产品总价（基）
    let productTotalBasePrice = exchangeRate
        * parseFloat($tr.find('td[data-name="productTotalPayPrice"]').find('span').text());
    // 订单的商品总价（基）
    let sumProductBasePrice = exchangeRate * parseFloat($("#sumProductPayPrice").text());
    // 优惠金额（基）
    let discountBasePrice = parseFloat($("#discountBasePrice").text());
    // 优惠金额（基）
    let shippingBasePrice = parseFloat($("#shippingBasePrice").text());
    // 成本总价（基） = 产品总价（基）- 优惠分摊金额（基） - 运费分摊金额（基） - 提货费分摊金额（基）
    let costTotalBasePrice = productTotalBasePrice //产品总价
        - discountBasePrice * productTotalBasePrice / sumProductBasePrice//优惠分摊金额
        + shippingBasePrice * productTotalBasePrice / sumProductBasePrice//运费分摊金额
    ;
    $tr.find('td[data-name="costTotalBasePrice"]').html(
        $("<span>").html(toFloat(costTotalBasePrice))
    );
    // 数量
    let num = $tr.find('td[data-name="num"]').find('span').text();
    // 成本单价（基）
    let costBasePrice = costTotalBasePrice / num;
    $tr.find('td[data-name="costBasePrice"]').html(
        $("<span>").html(toFloat(costBasePrice))
    );

    // 成本总价（付）
    $tr.find('td[data-name="costTotalPayPrice"]').html(
        $("<span>").html(toFloat(costTotalBasePrice / exchangeRate))
    );
    // 成本单价（付）
    $tr.find('td[data-name="costPayPrice"]').html(
        $("<span>").html(toFloat(costBasePrice / exchangeRate))
    );
}

/**
 * 更新基础货币的价格
 */
function updateBasePriceByTable($tr) {
    // 汇率
    let exchangeRate = $("#exchangeRate").val();

    // 产品单价（付）
    let productPayPrice = $tr.find('td[data-name="productPayPrice"]').find('span').text();
    // 产品单价（基）更新
    if (productPayPrice) {
        $tr.find('td[data-name="productBasePrice"]').html(
            $("<span>").html(toFloat(productPayPrice * exchangeRate))
        );
    }

    // 产品总价（付）
    let productTotalPayPrice = parseFloat($tr.find('td[data-name="productTotalPayPrice"]').find('span').text());
    // 产品总价（基）更新
    if (productTotalPayPrice) {
        $tr.find('td[data-name="productTotalBasePrice"]').html(
            $("<span>").html(toFloat(productTotalPayPrice * exchangeRate))
        );
    }

    // 成本单价（付）
    let costPayPrice = $tr.find('td[data-name="costPayPrice"]').find('span').text();
    // 成本单价（基）更新
    if (costPayPrice) {
        $tr.find('td[data-name="costBasePrice"]').html(
            $("<span>").html(toFloat(costPayPrice * exchangeRate))
        );
    }

    // 成本总价（付）
    let costTotalPayPrice = parseFloat($tr.find('td[data-name="costTotalPayPrice"]').find('span').text());
    // 成本总价（基）更新
    if (costTotalPayPrice) {
        $tr.find('td[data-name="costTotalBasePrice"]').html(
            $("<span>").html(toFloat(costTotalPayPrice * exchangeRate))
        );
    }
}

/**
 * 更新基础货币的价格
 */
function updateBasePrice() {
    // 汇率
    let exchangeRate = $("#exchangeRate").val();
    // 订单总价（付）
    let sumProductPayPrice = parseFloat($('#sumProductPayPrice').text());
    // 订单总价（基）更新
    if (sumProductPayPrice) {
        $('#sumProductBasePrice').html(toFloat(sumProductPayPrice * exchangeRate));
    }

    // 优惠总额（付）
    let discountPayPrice = parseFloat($('#discountPayPrice').val());
    // 优惠总额（基）更新
    if (discountPayPrice) {
        $('#discountBasePrice').html(toFloat(discountPayPrice * exchangeRate));
    }

    // 运费（付）
    let shippingPayPrice = parseFloat($('#shippingPayPrice').val());
    // 运费（基）更新
    if (shippingPayPrice) {
        $('#shippingBasePrice').html(toFloat(shippingPayPrice * exchangeRate));
    }

    // 运费（付）
    let sumCostPayPrice = parseFloat($('#sumCostPayPrice').text());
    // 运费（基）更新
    if (shippingPayPrice) {
        $('#sumCostBasePrice').html(toFloat(sumCostPayPrice * exchangeRate));
    }
}

/**
 * 计算订单数据总和
 * @param $table
 * @param filename
 */
function sumColumns($table) {
    sumColumn($table, $("#sumNum"), 'num');
    // 订单的商品总价(付)
    sumColumn($table, $("#sumProductPayPrice"), 'productTotalPayPrice');
    // 订单的商品总价(基)
    sumColumn($table, $("#sumProductBasePrice"), 'productTotalBasePrice');
    // 计算订单总成本
    sumPrice();
}

/**
 * 计算当前列的总和
 * @param $table
 * @param filename
 */
function sumColumn($table, $sum, filename) {
    let sum = 0;
    $table.find('tr').each(function () { // 注意这里不需要传入参数
        // 查找当前行中具有特定'data-name'属性的<td>元素，并获取其内<span>标签的文本内容
        let value = parseFloat($(this).find('td[data-name="' + filename + '"]').find('span').text()) || 0;
        sum += value; // 将转换后的数值加到总和上
    });
    $sum.html(sum)
}


/**
 * 计算订单总成本
 */
function sumPrice() {
    let sumProductBasePrice = parseFloat($("#sumProductBasePrice").text());
    let discountBasePrice = parseFloat($("#discountBasePrice").text());
    let shippingBasePrice = parseFloat($("#shippingBasePrice").text());
    let sumCostBasePrice = sumProductBasePrice - discountBasePrice + shippingBasePrice;
    $('#sumCostBasePrice').text(toFloat(sumCostBasePrice))

    // 汇率
    let exchangeRate = parseFloat($("#exchangeRate").val());
    let sumCostPayPrice = sumCostBasePrice / exchangeRate;
    $('#sumCostPayPrice').text(toFloat(sumCostPayPrice))
}

/**
 * 判断是不是数字，并将数字转为小数
 * @param s
 * @returns {string}
 */
function toFloat(s) {
    s = Number.isFinite(s) ? s : 0
    return s.toFixed(2);
}

/**
 * bootstrap中，修改某个字段时，
 * 同步中修改相关的字段，同时修改bootstrap中的row
 * @type {{syncData: Window.productCostTable.syncData}}
 */
window.productCostTable = {
    syncData: function ($table, fieldName, row, $td) {
        const $tr = $td.closest('tr');  // 获取当前行
        let $num = $tr.find('td[data-name="num"]');
        let $productPayPrice = $tr.find('td[data-name="productPayPrice"]');
        let $productBasePrice = $tr.find('td[data-name="productBasePrice"]');
        let $productTotalPayPrice = $tr.find('td[data-name="productTotalPayPrice"]');
        let $productTotalBasePrice = $tr.find('td[data-name="productTotalBasePrice"]');
        let exchangeRate = parseFloat($("#exchangeRate").val());
        // 根据关系 同步更新 数量，产品单价（付），产品总价（付）
        switch (fieldName) {
            case 'num' :
                $productTotalPayPrice.html(
                    $("<span>").html(
                        toFloat($num.find('span').text() * $productPayPrice.find('span').text())
                    )
                );
                $productTotalBasePrice.html(
                    $("<span>").html(
                        toFloat(exchangeRate * $num.find('span').text() * $productPayPrice.find('span').text())
                    )
                );
                break;
            case 'productPayPrice':
                $productBasePrice.html(
                    $("<span>").html(
                        toFloat(exchangeRate * $productPayPrice.find('span').text())
                    )
                );
                $productTotalPayPrice.html(
                    $("<span>").html(
                        toFloat($num.find('span').text() * $productPayPrice.find('span').text())
                    )
                );
                $productTotalBasePrice.html(
                    $("<span>").html(
                        toFloat(exchangeRate * $num.find('span').text() * $productPayPrice.find('span').text())
                    )
                );
                break;
            case 'productTotalPayPrice':
                $productPayPrice.html(
                    $("<span>").html(
                        toFloat($productTotalPayPrice.find('span').text() / $num.find('span').text())
                    )
                );
                $productBasePrice.html(
                    $("<span>").html(
                        toFloat(exchangeRate * $productPayPrice.find('span').text())
                    )
                );
                $productTotalBasePrice.html(
                    $("<span>").html(
                        toFloat(exchangeRate * $num.find('span').text() * $productPayPrice.find('span').text())
                    )
                );
                break;
        }
        // 更新统计数据
        sumColumns($table);
        // 计算成本单价（付） 和成本总价（付）
        updateAllCostPrice();
        // 更新基础货币相关的数据
        // updateBasePriceByTable($tr);
    }
}
